#include <iostream>
#include <string.h>

// int Port(int x)
// {
//     char ret;
//     memcpy(&ret, &x, sizeof(char));
//     return static_cast<int>(ret);
// }
// int main()
// {
//     std::cout << Port(1) << std::endl;
//     return 0;
// }

#include <thread>
#include <condition_variable>
#include <mutex>
using namespace std;
int main()
{
    int x = 1;
    condition_variable cv;
    mutex mtx;
    bool flag = false;
    thread t1([&](){
        for(size_t i = 0; i < 10; ++i)
        {
            unique_lock<mutex> lock(mtx);
            // if(flag)
                cv.wait(lock, [&](){ return flag == false; });
            flag = true;
            cout << this_thread::get_id() << "--" << x << endl;
            ++x;
            cv.notify_one();
        }
    });

    thread t2([&](){
        for(size_t i = 0; i < 10; ++i)
        {
            unique_lock<mutex> lock(mtx);
            // if(!flag)
                cv.wait(lock, [&](){ return flag; });
            flag = false;
            cout << this_thread::get_id() << "--" << x << endl;
            ++x;
            cv.notify_one();
        }
    });

    t1.join();
    t2.join();
    return 0;
}